import java.util.function.*;

/**
 * java中常用的函数式接口
 */
public class TestJavaFuncInterface {
    public static void main(String[] args) {
        /*
          Function<T, R>
          接受一个类型为 T 的参数，并返回一个类型为 R 的结果
         */
        // Function<Integer, String> function = (item) -> item.toString();
        Function<Integer, String> function = Object::toString;
        String functionResult = function.apply(888);
        System.out.println(functionResult);
        System.out.println("========================");


        /*
          Consumer<T>
          接受一个类型为 T 的参数，没有返回值。通常用于执行一些操作，如打印、修改对象状态等
         */
        // Consumer<String> consumer = (item) -> System.out.println(item);
        Consumer<String> consumer = System.out::println;
        consumer.accept("hello");
        System.out.println("========================");


        /*
          Supplier<R>
          不接受任何参数，返回一个类型为 R 的结果。可用于提供数据，比如创建对象或获取数据
         */
        Supplier<String> supplier = () -> "我是结果";
        String supplierResult = supplier.get();
        System.out.println(supplierResult);
        System.out.println("========================");

        /*
          Predicate<T>
          接受一个类型为 T 的参数，返回一个布尔值。常用于过滤操作
         */
        Predicate<Integer> predicate = (num) -> num > 5;
        boolean predicateResult1 = predicate.test(3);
        boolean predicateResult2 = predicate.test(6);
        System.out.println(predicateResult1);
        System.out.println(predicateResult2);
        System.out.println("========================");

        /*
          Bi开头的函数式接口和上面的函数式接口类似，不过入参变为2个
         */
        BiFunction<Integer, String, String> biFunction = (a, b) -> a + b;
        String biFunctionResult = biFunction.apply(567, "你妹");
        System.out.println(biFunctionResult);
        System.out.println("========================");

        BiConsumer<Integer, String> biConsumer = (a, b) -> System.out.println(a + b);
        biConsumer.accept(9, "你妹");
        System.out.println("========================");

        BiPredicate<Integer, Integer> biPredicate = (a, b) -> a > 5 && b > 10;
        boolean biPredicateResult1 = biPredicate.test(6, 9);
        boolean biPredicateResult2 = biPredicate.test(6, 12);
        System.out.println(biPredicateResult1);
        System.out.println(biPredicateResult2);
    }

}
